/**
 * stm32f10x.h(设备头文件); 工程预定义(USE_STDPERIPH_DRIVER)后会引入(stm32f10x_conf.h);
 * stdio.h : 打印,printf()
 * string.h : 处理字符串
 * stdarg.h 定义了一个变量类型(va_list)和三个宏,可用于在参数个数可变时获取函数中的参数。
 * [别的模块]只需引入(sys.h)即可
 */

#ifndef __SYS_H
#define __SYS_H
#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"
#include "stdarg.h"

//************************************位操作 begin *****************************************************************
//  SRAM区，1M字节的地址空间，(0x20000000~0x20100000)
//  片内外设区，1M字节的地址空间，(0x40000000~0x40100000)
//  位带区bit位膨胀4个字节
//  SRAM位带别名区地址 =  0x22000000 + (A - 0x20000000)*8*4+n*4
//  外设位带别名区的地址 = 0x42000000 + (A - 0x40000000)*8*4+n*4
#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x02000000 + ((addr & 0x00FFFFFF) << 5) + (bitnum << 2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))

// GPIO(ODR)和(IDR)寄存器地址映射
// ODR偏移12byte;  IDR偏移8byte ; 参照结构体GPIO_TypeDef定义
#define GPIOA_ODR_Addr (GPIOA_BASE + 12) // 0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE + 12) // 0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE + 12) // 0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE + 12) // 0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE + 12) // 0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE + 12) // 0x40011A0C
#define GPIOG_ODR_Addr (GPIOG_BASE + 12) // 0x40011E0C
//
#define GPIOA_IDR_Addr (GPIOA_BASE + 8) // 0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE + 8) // 0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE + 8) // 0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE + 8) // 0x40011408
#define GPIOE_IDR_Addr (GPIOE_BASE + 8) // 0x40011808
#define GPIOF_IDR_Addr (GPIOF_BASE + 8) // 0x40011A08
#define GPIOG_IDR_Addr (GPIOG_BASE + 8) // 0x40011E08

// 单独操作GPIOx_Pin,n(0~15)
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr, n) // 输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr, n)  // 输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr, n) // 输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr, n)  // 输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr, n) // 输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr, n)  // 输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr, n) // 输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr, n)  // 输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr, n) // 输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr, n)  // 输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr, n) // 输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr, n)  // 输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr, n) // 输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr, n)  // 输入
//************************************位操作 End************************************************

void RCC_Configuration(void);
void NVIC_Configuration(void);
void GetChipID(uint32_t *pArray);
uint32_t GetCRCValue(uint32_t *pBuffer, uint32_t BufferLength);

#endif
